package org.lanyu.springainovel.common.controller;

import org.lanyu.springainovel.common.entity.User;
import org.lanyu.springainovel.common.service.UserService;
import org.lanyu.springainovel.common.vo.RestVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

/**
 * 用户管理控制�? * 提供用户的CRUD操作
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 获取当前登录用户信息
     */
    @GetMapping("/info")
    public RestVO<?> getUserInfo() {
        try {
            // 从Security上下文中获取当前用户信息
            User principal =
                    (User) org.springframework.security.core.context.SecurityContextHolder
                            .getContext().getAuthentication().getPrincipal();
            
            User user = userService.getUserByUsername(principal.getUsername());
            // 移除敏感信息
            user.setPassword(null);
            
            return RestVO.success(user);
        } catch (Exception e) {
            return RestVO.fail("获取用户信息失败: " + e.getMessage());
        }
    }

    /**
     * 更新当前用户信息
     */
    @PutMapping("/update")
    public RestVO<?> updateUserInfo(@RequestBody User user) {
        try {
            // 使用UserService的updateUserInfo方法，它会自动处理custom字段
            User updatedUser = userService.updateUserInfo(user);
            
            // 移除敏感信息
            updatedUser.setPassword(null);
            
            return RestVO.success(updatedUser);
        } catch (Exception e) {
            return RestVO.fail("用户信息更新失败: " + e.getMessage());
        }
    }

    /**
     * 更新用户配置
     */
    @PutMapping("/config")
    public RestVO<?> updateUserConfig(@RequestBody com.alibaba.fastjson.JSONObject config) {
        try {
            // 获取当前用户
            User currentUser = userService.getCurrentUser();
            if (currentUser == null) {
                return RestVO.fail("用户未登陆");
            }
            
            // 直接更新用户配置
            currentUser.setCustom(config);
            currentUser.setUpdateTime(new java.util.Date());
            
            // 保存更新
            userService.updateUser(currentUser);
            
            // 移除敏感信息
            currentUser.setPassword(null);
            
            return RestVO.success(currentUser);
        } catch (Exception e) {
            return RestVO.fail("用户配置更新失败: " + e.getMessage());
        }
    }

    /**
     * 管理员功能：获取用户列表
     * 需要ADMIN角色才能访问
     */
    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/list")
    public RestVO<?> getUserList() {
        try {
            return RestVO.success(userService.getUserList());
        } catch (Exception e) {
            return RestVO.fail("获取用户列表失败: " + e.getMessage());
        }
    }

    /**
     * 管理员功能：根据ID获取用户信息
     * 需要ADMIN角色才能访问
     */
    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/{id}")
    public RestVO<?> getUserById(@PathVariable Long id) {
        try {
            User user = userService.getUserById(id);
            if (user == null) {
                return RestVO.fail("用户不存在");
            }
            // 移除敏感信息
            user.setPassword(null);
            return RestVO.success(user);
        } catch (Exception e) {
            return RestVO.fail("获取用户信息失败: " + e.getMessage());
        }
    }

    /**
     * 管理员功能：创建新用�?     * 需要ADMIN角色才能访问
     */
    @PreAuthorize("hasRole('ADMIN')")
    @PostMapping
    public RestVO<?> createUser(@RequestBody User user) {
        try {
            boolean created = userService.createUser(user);
            if (created) {
                return RestVO.success("用户创建成功");
            } else {
                return RestVO.fail("用户创建失败");
            }
        } catch (Exception e) {
            return RestVO.fail("用户创建失败: " + e.getMessage());
        }
    }

    /**
     * 管理员功能：更新用户信息
     * 需要ADMIN角色才能访问
     */
    @PreAuthorize("hasRole('ADMIN')")
    @PutMapping("/{id}")
    public RestVO<?> updateUser(@PathVariable Long id, @RequestBody User user) {
        try {
            user.setId(id);
            boolean updated = userService.updateUser(user);
            if (updated) {
                return RestVO.success("用户更新成功");
            } else {
                return RestVO.fail("用户更新失败");
            }
        } catch (Exception e) {
            return RestVO.fail("用户更新失败: " + e.getMessage());
        }
    }

    /**
     * 管理员功能：删除用户
     * 需要ADMIN角色才能访问
     */
    @PreAuthorize("hasRole('ADMIN')")
    @DeleteMapping("/{id}")
    public RestVO<?> deleteUser(@PathVariable Long id) {
        try {
            boolean deleted = userService.deleteUser(id);
            if (deleted) {
                return RestVO.success("用户删除成功");
            } else {
                return RestVO.fail("用户删除失败");
            }
        } catch (Exception e) {
            return RestVO.fail("用户删除失败: " + e.getMessage());
        }
    }
}
